package org.tri.persistence.search;

import java.util.Date;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.tri.entity.Establecimiento;
import org.tri.entity.Productor;

/**
 * La clase {@code BusquedaTransaccion} define el comportamiento de 
 * una busqueda de transacción, englobando las características comúnes
 * de las transacciones utilzadas en el negocio ( Compra y Venta )
 * @author kiira
 * @version 1.0, Nov 20, 2011
 */
public abstract class BusquedaTransaccion<K> extends Busqueda<K> {
    
    /**
     * Inicializa la busqueda.
     * @param clase clase de la transacción a buscar.
     */
    protected BusquedaTransaccion( Class<K> clase ) {
        super( clase );
        
    }//end constructor
    
    /**
     * Restringe la busqueda a todas aquellas transacciones
     * cuya fecha de realización sea mayor a la fecha indiada.
     * @param fecha fecha por la cual filtrar.
     */
    public void porFechaPosteriorA( Date fecha ) {
        //creamos y agregamos la restriccion
        Criterion restriccionFecha = Restrictions.ge( "fecha", fecha );
        
        agregarCriterio( restriccionFecha );
        
    }//end método porFechaPosteriorA
    
    /**
     * Restringe la busqueda a todas aquellas transacciones
     * cuya fecha de realización sea menor a la fecha indiada.
     * @param fecha fecha por la cual filtrar.
     */
    public void porFechaAnteriorA( Date fecha ) {
        //creamos y agregamos la restriccion
        Criterion restriccionFecha = Restrictions.le( "fecha", fecha );
        
        agregarCriterio( restriccionFecha );
        
    }//end métodoFechaMenorA
    
    /**
     * Restringe la busqueda a todas aquellas transacciones
     * cuya fecha de realización se encuentre dentro del rango
     * indicado.
     * @param fechaInicial cota izquierda del rango.
     * @param fechaFinal cota derecha del rango.
     */
    public void porFechaEnRango( Date fechaInicial, Date fechaFinal ) {
        //creamos y agregamos la restriccion
        Criterion restriccionFecha = Restrictions.between( "fecha", 
                                                           fechaInicial, 
                                                           fechaFinal );
        
        agregarCriterio( restriccionFecha );
        
    }//end método porFechaEnRango

    /**
     * Restringe la busqueda a un establecimiento en particular.
     * @param establecimiento establecimiento por el cual filtrar.
     */
    public void porEstablecimiento( Establecimiento establecimiento ) {
        //creamos y agregamos la restriccion
        Criterion restriccionEstablecimiento = Restrictions.sqlRestriction( 
                String.format( "{alias}.establecimiento = %d", 
                               establecimiento.getIdEstablecimiento() ) );
        
        agregarCriterio( restriccionEstablecimiento );
        
    }//end método porEstablecimiento
    
    /**
     * Restringe la busqueda a un productor en particular.
     * @param productor 
     */
    public void porProductor( Productor productor ) {
        //craemos un alias para el establecimiento
        crearAlias( "establecimiento", "est" );
        
        //creamos y agregamos la restriccion del productor
        Criterion restriccionProductor = Restrictions
                .eq( "est.productor", productor );
        
        agregarCriterio( restriccionProductor );
        
    }//end método porProductor
    
}//end clase BusquedaTransaccion

